//
//  main.c
//  ATM
//
//  Created by MAC on 16-3-1.
//  Copyright (c) 2016年 MAC. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
//#include <windows.h>
//函数声明区
void window();
void operFunc(int);
void getMoney();
void returnWindow();
void panduan(int);
void saveMoney();
void transfoCount();
void changePassword();
void check();
//全局变量声明区
int sysPassword=999999;//原始密码
double count = 10000.0;//账户余额
double othersCount = 0.0;//别人的账户余额
//1.验证密码，欢迎界面
void checkPassword()
{
    //从文件中获取原始密码
    int sysPassword2 = 0;
    FILE * fp  = fopen("/Users/mac/Desktop/数据结构/ATM/password.txt", "r");
    if (!fp) {
        printf("密码文件加载失败......\n");
        exit(0);
    }
    fscanf(fp, "%d", &sysPassword2);
    //printf("sysPassword2 = %d\n", sysPassword2) ;
    if (!sysPassword2) {
        int onePsd = 0, onePsdt = 0;
        printf("第一次登录，请设置原始密码：\n");
    loop:printf("请输入原始密码：");
        scanf("%d", &onePsd);
        printf("再输入原始密码：");
        scanf("%d", &onePsdt);
        if(onePsdt != onePsd)
        {
            printf("两次新密码设置不一样，请重新输入!\n");
            goto loop;
        }else{
            FILE * fp  = fopen("/Users/mac/Desktop/数据结构/ATM/password.txt", "w");
            if (!fp) {
                printf("密码文件加载失败......\n");
                exit(0);
            }
            int i = fprintf(fp, "%d", onePsd);
            if (!i) {
                printf("密码写入失败！\n");
                exit(0);
            }else{
                printf("密码写入成功!请重新登录\n");
                fclose(fp);
                checkPassword();
            }
        }
    }else{
        fclose(fp);
        //定义输入的密码变量名
        int inPassword=0;
        int times=0;//密码输入的次数
        printf("－－－欢迎使用ATM机－－－\n");
        printf("请输入银行卡密码：");
        scanf("%d", &inPassword);
        
        while (inPassword<100000||inPassword>999999)
        {
            printf("错误：请输入六位数密码！\n");
            printf("请输入银行卡密码：");
            scanf("%d", &inPassword);
        }
        times ++;
        //strcmp(str1, str2);
        while (inPassword!=sysPassword2) {
            //判断是不是第三次数错，如果是直接退出程序
            //strcmp();
            if(times == 3)
            {
                printf("密码连续错误三次，你的卡已被冻结!\n");
                exit(0);
            }
            
            
            //提示密码错误，给机会重新输入
            printf("密码第%d次输入错误,还有%d次机会！\n",times,3-times);
            printf("请输入银行卡密码：");
            scanf("%d", &inPassword);
            times++;
        }
        
        
        printf("恭喜你密码输入正确!\n");
        window();
    }
    
    
    
    
    //......
    
}

//主界面函数
void window()
{
    int oper = 0;
    printf("欢迎进入ATM自动存取款机\n");
    printf("－－－－－－－－\n");
    printf("1-取款   2-存款\n");
    printf("3-转账   4-改密\n");
    printf("5-查询   6-退卡\n");
    printf("－－－－－－－－\n");
    printf("请输入操作指令（1-6）：");
    scanf("%d", &oper);
    while (oper>6||oper<1) {
        printf("指令输入有误，请重新输入!\n");
        printf("请输入操作指令（1-6）：");
        scanf("%d", &oper);
    }
    operFunc(oper);
}
//指令处理函数
void operFunc(int op)
{
    //printf("指令传过来了\n");
    switch (op) {
        case 1:
            //取款功能
            printf("取款进行中……\n");
            getMoney();
            break;
        case 2:
            //存款功能.
            printf("存款进行中……\n");
            saveMoney();
            break;
        case 3:
            //转账功能
            printf("转账进行中……\n");
            transfoCount();
            break;
        case 4:
            //改密功能
            printf("改密进行中……\n");
            changePassword();
            break;
        case 5:
            //查询功能
            printf("查询进行中……\n");
            check();
            break;
        case 6:
            //退卡功能
            printf("退卡进行中……\n");
            exit(0);
            break;
            
        default:
            break;
    }
}

//取款函数
void getMoney()
{
    int pick = 0;//取款金额对应的编号
    int outMoney = 0;//取款金额
    printf("1-100     2-300\n");
    printf("3-500     4-1000\n");
    printf("5-2000    6-其他金额\n");
    printf("请选择你的取款金额：");
    scanf("%d",&pick);
    switch (pick) {
        case 1:
            outMoney = 100;
            //判断取款余额是否足够
            panduan(outMoney);
            break;
        case 2:
            outMoney = 300;
            //判断取款余额是否足够
            panduan(outMoney);
            break;
        case 3:
            outMoney = 500;
            //判断取款余额是否足够
            panduan(outMoney);
            break;
        case 4:
            outMoney = 1000;
            //判断取款余额是否足够
            panduan(outMoney);
            break;
        case 5:
            outMoney = 2000;
            //判断取款余额是否足够
            panduan(outMoney);
            break;
        case 6:
            printf("请输入你的取款金额（整百）:");
            scanf("%d",&outMoney);
            while (outMoney%100!=0||outMoney==0) {
                printf("取款金额有误，请输入整百！\n");
                printf("请输入你的取款金额（整百）:");
                scanf("%d",&outMoney);
            }
            panduan(outMoney);
            break;
        default:
            break;
    }
}

//是否返回主界面的函数
void returnWindow()
{
    printf("返回主界面（输入1）？  退卡（输入0）？\n");
    int choice = 0;
    scanf("%d",&choice);
    if (choice == 1) {
        window();
    }
    else
    {
        printf("欢迎下次继续使用\n");
        exit(0);
    }
}

//判断取款金额
void panduan(int outMoney)
{
    if (outMoney > count) {
        printf("***余额不足，取款失败***\n");
        printf("继续取款（输入1）？  退卡（输入0）？\n");
        int choice = 0;
        scanf("%d",&choice);
        if (choice == 1) {
            getMoney();
        }
        else
        {
            printf("欢迎下次继续使用\n");
            exit(0);
        }
    }
    else{
        
        count = count - outMoney;
        printf("取款成功，取款金额：%d,账户当前余额：%.2lf\n",outMoney,count);
        returnWindow();
    }
    
}

//存款函数
void saveMoney()
{
    int inputMoney=0;
    printf("请将钞票整理整齐放入验钞口!\n");
    scanf("%d",&inputMoney);
    printf("正在验钞......\n");
    printf("你存款金额为：%d元!\n",inputMoney);
    printf("交易正在进行中......\n");
    count += inputMoney;
    printf("存款成功，当前账户余额：%.2lf\n",count);
    returnWindow();
}


//转账函数
void transfoCount()
{
    int transMoney = 0;
    printf("请输入转账金额:");
    scanf("%d",&transMoney);
    if (transMoney > count) {
        printf("****转账失败，余额不足****\n");
        returnWindow();
    }
    else{
        count -= transMoney;
        othersCount += transMoney;
        printf("转账成功，账户当前余额：%.2lf\n",count);
        returnWindow();
    }
}

//修改密码
void changePassword()
{
    //1.验证原始密码
    //定义输入的密码变量名
    int inPassword=0;
    int times=0;//密码输入的次数
    int newPassword1 = 0;
    int newPassword2 = 0;
    printf("请输入银行卡原密码：");
    scanf("%d", &inPassword);
    times ++;
    //strcmp(str1, str2);
    while (inPassword!=sysPassword) {
        //判断是不是第三次数错，如果是直接退出程序
        //strcmp();
        if(times == 3)
        {
            printf("原密码连续错误三次，你的卡已被冻结!\n");
            exit(0);
        }
        //提示密码错误，给机会重新输入
        printf("原密码第%d次输入错误,还有%d次机会！\n",times,3-times);
        printf("请输入银行卡密码：");
        scanf("%d", &inPassword);
        times++;
    }
    //2.输入新密码
    printf("原密码输入正确！\n");
    printf("请输入新密码：");
    scanf("%d",&newPassword1);
    printf("请再次输入新密码：");
    scanf("%d",&newPassword2);
    while (newPassword1!=newPassword2) {
        printf("两次新密码输入不一致，请重新输入！\n");
        printf("请输入新密码：");
        scanf("%d",&newPassword1);
        printf("请再次输入新密码：");
        scanf("%d",&newPassword2);
    }
    sysPassword = newPassword1;
    printf("密码修改成功，请重新登录!\n");
    //3.重新登录
    checkPassword();
}

//查询函数
void check()
{
    printf("查询成功，当前账户余额：%.2lf\n",count);
    returnWindow();
}

int main(int argc, const char * argv[])
{
    
    checkPassword() ;
    return 0;
}



